/*
Copyright (c) [2019年5月1日] [吴超]
[MBT_Studio] is licensed under Mulan PSL v2.
You can use this software according to the terms and conditions of the Mulan PSL v2.
You may obtain a copy of Mulan PSL v2 at:
		 http://license.coscl.org.cn/MulanPSL2
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
See the Mulan PSL v2 for more details.
*/
#pragma once

#include "../节点.h"





class API_EXPORT C_数据缓存写入节点 : public C_节点基类 {

public:
	C_数据缓存写入节点(S_设备环境& ctx);
	~C_数据缓存写入节点();

	S_Props	m_Path;
	S_Props	m_文件名;
	S_Props m_格式;
	S_Props	m_压缩;
	S_Props	m_覆盖文件;
	S_Props	m_序列;

	bool	f_update();

	void	f_读取(FILE* f);
	void	f_写入(FILE* f);
};

C_节点基类* f_node_创建写入数据缓存节点(S_设备环境& ctx, C_节点树* 子节点树);
C_节点基类* f_node_加载写入数据缓存节点(S_设备环境& ctx, FILE* f);
void		f_node_保存写入数据缓存节点(C_节点基类* n, FILE* f);




class API_EXPORT C_数据缓存读取节点 : public C_节点基类 {
	std::vector<S_Array*> m_预载缓存;
public:
	C_数据缓存读取节点(S_设备环境& ctx);
	~C_数据缓存读取节点();

	S_Props	m_Path;
	S_Props m_格式;
	S_Props	m_文件名;
	S_Props	m_序列;
	S_Props	m_开启预载;
	S_Props	m_预载区间;

	bool	f_update();

	void	f_读取(FILE* f);
	void	f_写入(FILE* f);
};

C_节点基类* f_node_创建数据缓存读取节点(S_设备环境& ctx, C_节点树* 子节点树);
C_节点基类* f_node_加载数据缓存读取节点(S_设备环境& ctx, FILE* f);
void		f_node_保存数据缓存读取节点(C_节点基类* n, FILE* f);





class API_EXPORT C_物体缓存节点 : public C_节点基类 {
	

	std::vector<S_Tranform> m_变换组;
	S_OBArray*				m_拷贝物体组;
public:
	C_物体缓存节点(S_设备环境& ctx);
	~C_物体缓存节点();

	std::string m_上一次加载路径;

	S_Props	m_Path;
	S_Props m_类型;
	S_Props	m_应用变换;
	S_Props	m_中心变换方式;
	S_Props	m_实时写入;
	S_Props	m_压缩;
	S_Props	m_复制;
	S_Props	m_多线程;

	bool	f_update();
	void	f_释放缓存();

	void	f_读取(FILE* f);
	void	f_写入(FILE* f);
	S_物体* f_虚拟体();
	void	f_删除();
	void	f_回收();
	void    f_Show(bool open);
};

C_节点基类* f_node_创建物体缓存节点(S_设备环境& ctx, C_节点树* 子节点树);
C_节点基类* f_node_加载物体缓存节点(S_设备环境& ctx, FILE* f);
void		f_node_保存物体缓存节点(C_节点基类* n, FILE* f);




//class API_EXPORT C_物体保存节点 : public C_节点基类 {
//	
//public:
//	C_物体保存节点(S_设备环境& ctx);
//	~C_物体保存节点();
//
//	std::string m_上一次加载路径;
//
//	S_Props	m_Path;
//	S_Props m_类型;
//	S_Props	m_应用变换;
//	S_Props	m_中心变换方式;
//	S_Props	m_压缩;
//	S_Props	m_复制;
//	S_Props	m_多线程;
//
//	bool	f_update();
//
//	void	f_读取(FILE* f);
//	void	f_写入(FILE* f);
//	S_物体* f_get虚拟体();
//	void	f_入回收();
//	void	f_回收();
//	void    f_Show(bool open);
//};
//
//C_节点基类* f_node_创建物体加载节点(S_设备环境& ctx, C_节点树* 子节点树);
//C_节点基类* f_node_加载物体加载节点(S_设备环境& ctx, FILE* f);
//void		f_node_保存物体加载节点(C_节点基类* n, FILE* f);

class API_EXPORT C_物体加载节点 : public C_节点基类 {

	std::vector<S_Tranform> m_变换组;
	S_OBArray* m_拷贝物体组;
public:
	C_物体加载节点(S_设备环境& ctx);
	~C_物体加载节点();

	std::string m_上一次加载路径;

	S_Props	m_Path;
	S_Props m_类型;
	S_Props	m_应用变换;
	S_Props	m_中心变换方式;
	S_Props	m_压缩;
	S_Props	m_复制;
	S_Props	m_多线程;

	bool	f_update();

	void	f_读取(FILE* f);
	void	f_写入(FILE* f);
	S_物体* f_虚拟体();
	void	f_删除();
	void	f_回收();
	void    f_Show(bool open);
};

C_节点基类* f_node_创建物体加载节点(S_设备环境& ctx, C_节点树* 子节点树);
C_节点基类* f_node_加载物体加载节点(S_设备环境& ctx, FILE* f);
void		f_node_保存物体加载节点(C_节点基类* n, FILE* f);



class API_EXPORT C_网格缓存写入节点 : public C_节点基类 {
	std::string m_上一次加载路径;
public:
	C_网格缓存写入节点(S_设备环境& ctx);
	~C_网格缓存写入节点();

	S_Props	m_Path;
	S_Props	m_文件名称;
	S_Props	m_使用物体名称;
	S_Props	m_覆盖文件;
	S_Props	m_序列文件;
	S_Props m_元素;
	S_Props	m_应用变换;
	S_Props	m_中心变换方式;
	S_Props	m_压缩;
	S_Props	m_压缩等级;
	S_Props	m_实时写入;

	bool	f_update();

	void	f_读取(FILE* f);
	void	f_写入(FILE* f);
	S_物体* f_虚拟体();
	void	f_删除();
	void	f_回收();
	void    f_Show(bool open);
};

C_节点基类* f_node_创建网格缓存写入节点(S_设备环境& ctx, C_节点树* 子节点树);
C_节点基类* f_node_加载网格缓存写入节点(S_设备环境& ctx, FILE* f);
void		f_node_保存网格缓存写入节点(C_节点基类* n, FILE* f);




class API_EXPORT C_读取网格缓存节点 : public C_节点基类 {
	std::string m_上一次加载路径;

	std::vector<S_Tranform> m_变换组;
public:
	C_读取网格缓存节点(S_设备环境& ctx);
	~C_读取网格缓存节点();

	S_Props	m_递归目录;
	S_Props	m_所有文件;
	S_Props	m_Path;
	S_Props	m_文件名称;
	S_Props	m_序列文件;
	S_Props	m_循环区间;
	S_Props m_元素;
	S_Props m_过滤格式;
	S_Props	m_应用变换;
	S_Props	m_中心变换方式;

	S_Props	m_填充多边形;

	void	f_加载网格(const std::filesystem::path& path);
	bool	f_update();

	void	f_读取(FILE* f);
	void	f_写入(FILE* f);
	S_物体* f_虚拟体();
	void	f_删除();
	void	f_回收();
	void    f_Show(bool open);
};

C_节点基类* f_node_创建读取网格缓存节点(S_设备环境& ctx, C_节点树* 子节点树);
C_节点基类* f_node_加载读取网格缓存节点(S_设备环境& ctx, FILE* f);
void		f_node_保存读取网格缓存节点(C_节点基类* n, FILE* f);









